home *** CD-ROM | disk | FTP | other *** search
/ Gamers Delight 2 / Gamers Delight 2.iso / Aminet / game / misc / Jack.lha / BlackJack / source.lha / source / shuffle.a < prev    next >
Text File  |  1994-08-24  |  7KB  |  295 lines

  1. *
  2. ; $VER: shuffle.a 1.91 (08.20.94)
  3. ;
  4. ; Shuffle algorithm and stats algorithm for Black Jack
  5. ;  Written by John Corigliano 1994
  6. *
  7.  
  8. *------Includes
  9.  
  10.     INCLUDE "intuition/intuition.i"
  11.  
  12.  
  13.  
  14. *------Equates
  15.  
  16. ADECK               EQU     104     ; 52 * 2 (sizeof(UWORD))
  17. Card_sizeof         EQU     14      ; 1 UBYTE and 3 PTRS + pad
  18.  
  19. ; Exec
  20. _LVOAllocMem        EQU     -$C6
  21. _LVOFreeMem         EQU     -$D2
  22.  
  23. ; Gfx
  24. _LVOVBeamPos        EQU     -$180
  25. _LVOSetAPen         EQU     -$156
  26. _LVOMove            EQU     -$F0
  27. _LVOText            EQU     -$3C
  28.  
  29.  
  30. *------Macros
  31.  
  32. LIBCALL     MACRO
  33.             movea.l _\2,a6
  34.             jsr     _LVO\1(a6)
  35.             ENDM
  36.  
  37.  
  38. *------Externals
  39.  
  40.         XDEF    @shuffle
  41.         XDEF    @showStats
  42.  
  43.         XREF    _SysBase
  44.         XREF    _GfxBase
  45.  
  46.         XREF    @wText
  47.         XREF    @gauge
  48.         XREF    _pNum
  49.         XREF    _win_offset
  50.  
  51.         XREF    _num_decks          ;UBYTE
  52.         XREF    _deck               ;PTR-PTR to struct Card
  53.         XREF    _dealt              ;UWORD
  54.         XREF    _p_crd              ;PTR to UBYTE
  55.         XREF    _d_crd              ;PTR to UBYTE
  56.         XREF    _stat_win           ;PTR to window
  57.         XREF    _jdeck              ;PTR to struct Card
  58.  
  59.  
  60. *------Code
  61.  
  62.         SECTION text,CODE
  63.  
  64. @shuffle:
  65.         movem.l d0-d7/a0-a6,-(a7)
  66.  
  67.         move.w  #0,_dealt
  68.         lea     s_text,a0
  69.         jsr     @wText
  70.         
  71.         clr.l   d2
  72.         move.b  _num_decks,d2       ; d2 = number of decks
  73.         mulu    #ADECK,d2           ; d2 = 52 * 2 * number of decks
  74.         move.l  d2,d0
  75.         clr.l   d1                  ; MEMF_ANY
  76.         LIBCALL AllocMem,SysBase
  77.         move.l  d0,a5               ; a5 points to memory
  78.         beq.w   done                ; quit if no mem
  79.  
  80.         move.l  d0,a0               ; Find end of mem block
  81.         move.l  d0,a1
  82.         add.l   d2,a0
  83. setmem:
  84.         move.l  #$FFFFFFFF,(a1)+    ; setmem (LONG WORD)
  85.         cmp.l   a0,a1
  86.         beq.s   cards
  87.         bra.s   setmem
  88.  
  89. cards:  
  90.         move.l  #12,d0              ; for 13 cards
  91.         lea     _p_crd,a0           ; Player's 'cards'
  92.         lea     _d_crd,a1           ; Dealer's 'cards'
  93. s_loop:
  94.         clr.b   (a0)+
  95.         clr.b   (a1)+
  96.         dbra    d0,s_loop
  97.  
  98. mix:    
  99.         move.l  a5,a0
  100.         subq    #2,a0
  101.         move.l  a5,a1
  102.         add.l   d2,a0
  103.         divu    #2,d2
  104.         subq    #1,d2
  105.  
  106.         LIBCALL VBeamPos,GfxBase
  107.         move.l  d0,d7               ; rand seed
  108.  
  109. get_rand:
  110.         mulu    #5,d7               ; multiplier
  111.         add     #12479,d7           ; increment
  112.         divu    #32768,d7           ; modulus
  113.         clr.w   d7                  ; only need remainder
  114.         swap    d7                  ; remainder
  115.         move.w  d7,d0               ; return value in d0
  116.         andi.w  #$1FF,d0            ; only need low 7 bits - max = 416
  117. dec:
  118.         cmp.w   d2,d0               ; is d0 > num cards
  119.         ble.s   check
  120.         divu    d2,d0
  121.         clr.w   d0
  122.         swap    d0
  123.         bra.s   dec
  124. check:  
  125.         cmp.w   (a1),d0             ; is it in the array already
  126.         bne.s   is_good
  127.         move.l  a5,a1               ; it's in the array!
  128.         bra.s   get_rand            ; try new number
  129. is_good:
  130.         cmp.w   #$FFFF,(a1)         ; haven't got this far yet
  131.         beq.s   go_on               ; put it in the array!
  132.         addq    #2,a1               ; pnt to next element of array
  133.         bra.s   check
  134. go_on:
  135.         move.w  d0,(a1)             ; copy d0 to array
  136.         cmp.l   a1,a0               ; end of array?
  137.         beq.s   sort
  138.         move.l  a5,a1               ; go back to start of array
  139.         bra.s   get_rand
  140.  
  141. sort:
  142.         move.l  _deck,a1            ; 1st element of array of PTR to Card
  143.  
  144.         move.l  a5,a0
  145. loop1:
  146.         lea     _jdeck,a2           ; 1st of 13 PTRs to Card
  147.         clr.l   d0
  148.         clr.l   d1
  149.         move.w  (a0),d1             ; 1st element (0-51)
  150.         divu    #52,d1
  151.         swap    d1
  152.         clr.w   d1                  ; integer division
  153.         swap    d1                  ; num = temp[i] / 52
  154.         mulu    #52,d1              ; num = num * 52
  155.         move.w  (a0)+,d0
  156.         sub.w   d1,d0               ; num = temp[i] - num
  157.         mulu    #Card_sizeof,d0     ; offset from jdeck[0]
  158.         add.l   d0,a2
  159.         move.l  a2,(a1)+
  160.         dbra    d2,loop1
  161.  
  162. free_mem:
  163.         movea.l a5,a1
  164.         clr.l   d0
  165.         move.b  _num_decks,d0       ; d2 = number of decks
  166.         mulu    #ADECK,d0           ; d2 = 52 * 2 * number of decks
  167.         LIBCALL FreeMem,SysBase
  168.  
  169. done:
  170.         lea     ok_text,a0
  171.         jsr     @wText
  172.         jsr     @gauge
  173.         bra.s   stat
  174.  
  175. @showStats:
  176.         movem.l d0-d7/a0-a6,-(a7)
  177.  
  178. stat:
  179.         movea.l _stat_win,a0
  180.         cmp.l   #0,a0
  181.         beq.w   exit
  182.  
  183.         clr.l   d0
  184.         clr.l   d1
  185.         clr.l   d2
  186.         clr.l   d3
  187.         clr.l   d4
  188.         clr.l   d7
  189.         move.l  wd_RPort(a0),a1         ; win->RPort in a1
  190.         move.b  #1,d0
  191.         LIBCALL SetAPen,GfxBase
  192.  
  193.         move.b  _num_decks,d2
  194.         lsl.b   #2,d2                   ; total in d2
  195.         move.b  #12,d3                  ; d3 = x
  196.         move.b  #21,d4                  ; d4 = y
  197.         lea     _p_crd,a2
  198.         lea     _d_crd,a3
  199.  
  200. calc:
  201.         clr.l   d5
  202.         move.b  (a2),d5                 ; d5 = perc
  203.         add.b   (a3),d5
  204.         mulu    #100,d5
  205.         divu    d2,d5
  206.         swap    d5
  207.         clr.w   d5
  208.         swap    d5
  209.         lea     str,a0
  210.  
  211.         clr.l   d0                      ; Convert decimal to letter
  212.         cmp.b   #10,(a2)
  213.         bge.s   .b1
  214.         move.b  #32,(a0)+
  215.         move.b  (a2)+,(a0)
  216.         addi    #48,(a0)+
  217.         bra.s   .b2
  218. .b1     move.b  (a2)+,d0
  219.         divu    #10,d0
  220.         move.b  d0,(a0)
  221.         addi    #48,(a0)+
  222.         swap    d0
  223.         move.b  d0,(a0)
  224.         addi    #48,(a0)+
  225.  
  226. .b2     move.b  #32,(a0)+
  227.         move.b  #32,(a0)+
  228.         clr.l   d0
  229.         cmp.b   #10,(a3)
  230.         bge.s   .b3
  231.         move.b  #32,(a0)+
  232.         move.b  (a3)+,(a0)
  233.         addi    #48,(a0)+
  234.         bra.s   .b4
  235. .b3     move.b  (a3)+,d0
  236.         divu    #10,d0
  237.         move.b  d0,(a0)
  238.         addi    #48,(a0)+
  239.         swap    d0
  240.         move.b  d0,(a0)
  241.         addi    #48,(a0)+
  242.  
  243. .b4     move.b  #32,(a0)+
  244.         move.b  #32,(a0)+
  245.         cmp.b   #100,d5
  246.         bne.s   br_01
  247.         move.b  #'-',(a0)+
  248.         move.b  #'-',(a0)+
  249.         bra.s   print_it
  250. br_01   cmp.b   #9,d5        
  251.         ble.s   br_02
  252.         divu    #10,d5
  253.         move.b  d5,(a0)
  254.         addi    #48,(a0)+
  255.         swap    d5
  256.         move.b  d5,(a0)
  257.         addi    #48,(a0)+
  258.         bra.s   print_it
  259. br_02   move.b  #32,(a0)+
  260.         move.b  d5,(a0)
  261.         addi    #48,(a0)+
  262.  
  263. print_it:
  264.         movea.l _stat_win,a4
  265.         move.l  wd_RPort(a4),a1         ; win->RPort in a1
  266.         move.b  #0,(a0)
  267.         move.l  #30,d0
  268.         move.l  d4,d1
  269.         add.b   _win_offset,d1
  270.         LIBCALL Move,GfxBase
  271.         move.l  #10,d0
  272.         lea     str,a0
  273.         LIBCALL Text,GfxBase
  274.         add.b   #10,d4
  275.         dbra    d3,calc
  276.  
  277. exit:
  278.         movem.l (a7)+,d0-d7/a0-a6
  279.         rts
  280.  
  281.  
  282. *------Variables
  283.  
  284.         SECTION  mem,BSS
  285.  
  286. str     ds.b    11
  287.  
  288.  
  289.         SECTION data,DATA
  290.  
  291. s_text  dc.b    'Shuffling....',0
  292. ok_text dc.b    'Okay...',0
  293.  
  294.     end
  295.